//
// Created by Toosan on 2022/5/3.
//

#include "iostream"
#include "pthread.h"
#include "queue"
#include "unistd.h"

using namespace std;

// TODO C++ 互斥锁 == Java中的synchronize  确保多线程操作的安全性
pthread_mutex_t mutex;
queue<int> queueThread;

void *runTask(void *number) {

    // 这两行代码之间的代码是线程安全的， 相当于java中被synchronize的代码块
    pthread_mutex_lock(&mutex);
    if (!queueThread.empty()) {
        cout << "threadId = " << *static_cast<int *>(number) << ", queueValue = " << queueThread.front() << endl;
        queueThread.pop();
    } else {
        cout << "queueThread is empty." << endl;
    }
    pthread_mutex_unlock(&mutex);
    return 0;
}

/**
 * 锁的学习
 * @return
 */
int main() {
    // 定一个互斥锁，不允许存在野指针，必须初始化
    pthread_mutex_init(&mutex, NULL);
    for (int i = 10000; i < 10006; ++i) {
        queueThread.push(i);
    }
    pthread_t threadIds[11];
    // 创建10个线程
    int a[10];
    for (int j = 0; j < 10; j++) {
        a[j] = j;
        pthread_create(&threadIds[j], 0, runTask, &a[j]);
        // 这里不能使用join去等待，不然没有多线程的意义了，需要一个一个线程等待。
//        pthread_join(threadIds[j],0);
    }
    sleep(1);
    pthread_mutex_destroy(&mutex);
    return 0;
}